//这里统一配置axios
import axios from "axios";
// 引入json-bigint插件
import JSONbig from "json-bigint";
import { getToken } from "@/utils/localStorage.js";
import router from "@/router/index.js";
import store from "@/store/index.js";

const instance = axios.create({
  baseURL: "http://ttapi.research.itcast.cn",
  headers: {
    "Content-Type": "application/json"
  },
  // 响应拦截 处理后台返回的大数
  transformResponse: [
    function(data) {
      try {
        // console.log(JSONbig.parse(data), "处理后的大数");
        return JSONbig.parse(data);
      } catch (err) {
        console.log(err, "大数处理失败");
        return data;
      }
    }
  ]
});

// 请求拦截器 统一配置token
instance.interceptors.request.use(
  function(config) {
    let tokenInfo = getToken();
    if (tokenInfo && tokenInfo.token) {
      config.headers.Authorization = `Bearer ${tokenInfo.token}`;
    }
    return config;
  },
  function(err) {
    return Promise.reject(err);
  }
);

// 响应拦截器  对服务端的返回做出拦截
//判断token以及token过期的问题
instance.interceptors.response.use(
  function(response) {
    // 对响应数据做点什么
    // console.log(response,"后台返回");
    console.log(router, "router");
    return response;
  },
  async function(error) {
    // 对响应错误做点什么
    if (error.response && error.response.status === 401) {
      // 判断是不是有token
      let refresh_token = getToken().refresh_token;
      // 当前在哪个页面
      let url = router.currentRoute.path;
      if (refresh_token) {
        // token存在,过期了
        // 请求新的token
        try {
          const res = await axios({
            method: "PUT",
            url: "http://ttapi.research.itcast.cn/app/v1_0/authorizations",
            headers: {
              Authorization: `Bearer ${refresh_token}`
            }
          });
          console.log(res, "新token");
          store.commit("update", res.data.data.token);
          return instance(error.config); // error.config代表本来请求接口但是token过期的请求配置
        } catch (err) {
          // 说明更新token失败,跳转登录页
          router.push("/login?backto=" + url);
        }
      } else {
        // 说明没有登录,跳往登录页
        // 当前在哪个页面
        let url = router.currentRoute.path;
        router.push("/login?backto=" + url);
      }
    } else {
      //放行不管
      return Promise.reject(error);
    }
  }
);

// 导出instance
export default instance;
